// 深复制。不能复制里面的方法
const deep = (source) => {
	if (typeof(source) === 'object') {
		return JSON.parse(JSON.stringify(source))
	}
	return source
}
// 全部复制。能复制里面的方法
const all = (source) => {
	if (typeof(source) === 'object') {
		/**
		 * 处理要复制的内容
		 * value：内容
		 * key：该内容对应的key
		 * obj：该内容的父对象结果
		 */
		const handleCopy = (value, key, obj) => {
			if (Object.prototype.toString.call(value) === '[object Object]') {
				if (obj) {
					obj[key] = copyObj(value)
				}
				return copyObj(value)
			} else if (Array.isArray(value)) {
				if (obj) {
					obj[key] = copyArr(value)
				}
				return copyArr(value)
			} else {
				if (obj) {
					obj[key] = value
				}
				return value
			}
		}
		const copyObj = (obj) => {
			const newObj = {}
			Object.keys(obj).forEach(key => {
				handleCopy(obj[key], key, newObj)
			})
			return newObj
		}
		const copyArr = (arr, key, obj) => {
			const newArr = []
			arr.map(item => {
				newArr.push(handleCopy(item))
			})
			return newArr
		}
		return handleCopy(source)
	}
	return source
}
/**
 * 赋值或者复制的方法
 */
module.exports = {
	deep, all,
	/**
	 * 部分赋值
	 * 将新的内容赋值给原对象
	 * @param {Object} data 新的内容，要赋值给原对象
	 * @param {Object} source 原对象
	 */
	update(data, source) {
		if (Object.prototype.toString.call(data) === '[object Object]') {
			if (Object.prototype.toString.call(source) === '[object Object]') {
				Object.keys(data).forEach(key => {
					source[key] = all(data[key])
				})
			}
		}
	},
	/**
	 * 补充赋值
	 * 原对象中存在，就不赋值。只赋值原对象中不存在的
	 * @param {Object} data 新的内容，要赋值给原对象
	 * @param {Object} source 原对象
	 */
	add(data, source) {
		if (Object.prototype.toString.call(data) === '[object Object]') {
			if (Object.prototype.toString.call(source) === '[object Object]') {
				Object.keys(data).forEach(key => {
					if (source[key] || source[key] === 0 || source[key] === false) {
						// 这种情况不用复制
					} else {
						source[key] = all(data[key])
					}
				})
			}
		}
	},
	/**
	 * 替换复制
	 * 完全清空原对象内容后再赋值
	 * @param {Object} data 新的内容，要赋值给原对象
	 * @param {Object} source 原对象
	 */
	replace(data, source) {
		if (Object.prototype.toString.call(data) === '[object Object]') {
			if (Object.prototype.toString.call(source) === '[object Object]') {
				Object.keys(source).forEach(key => {
					delete source[key]
				})
				Object.keys(data).forEach(key => {
					source[key] = all(data[key])
				})
			}
		}
	}
}